package com.mzz.behavior.fatherandson.strategy;

/**
 * 策略模式Demo
 *
 * <h1>策略模式定义:
 *         <h1>策略模式定义了一系列的算法，并将每一个算法 (作为类) 封装起来，
 *         而且使它们还可以相互替换，策略模式让算法独立于使用它的客户而独立变化。 策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。
 *
 *         <p>
 *         策略模式的意义:
 *         <p>
 *         策略模式使开发人员能够开发出由许多可替换的部分组成的软件，并且各个部分之间是低耦合的关系。<br/>
 *         低耦合的特性使软件具有更强的可扩展性，易于维护；更重要的是，它大大提高了软件的可重用性
 *
 *         <p>
 *         策略模式中有三个对象： 环境对象或者成为上下文对象(Context)：该类中实现了对抽象策略中定义的接口或者抽象类的引用。
 *         抽象策略对象(Strategy)：它可由接口或抽象类来实现。
 *         具体策略对象(ConcreteStrategy)：它封装了实现同不功能的不同算法。
 *
 *         --> 具体实例 （负载均衡）
 *
 * @author xushijian
 * @date 18/5/16
 *
 */
public class StrategyDemo {

    public static void main(String[] args) {

        Context<Integer, Integer, Integer> contextAdd = new Context<Integer, Integer, Integer>(new AddStrategy());
        System.out.println("加法：");
        System.out.println(contextAdd.algorithm(1111111, 3333225));

        Context<Integer, Integer, Integer> contextSub = new Context<Integer, Integer, Integer>(new SubStrategy());
        System.out.println("减法：");
        System.out.println(contextSub.algorithm(1111111, 3333225));

        Context<Long, Integer, Integer> contextMultiply = new Context<Long, Integer, Integer>(new MultiplyStrategy());
        System.out.println("乘法：");
        System.out.println(contextMultiply.algorithm(1111111, 3333225));

        Context<Double, Integer, Integer> contextDivision = new Context<Double, Integer, Integer>(new DivisionStrategy());
        System.out.println("除法：");
        System.out.println(contextDivision.algorithm(1111111, 3333225));
    }
}


